﻿using System;
using System.Collections.Generic;
using ibba.src.silverlight;

namespace ibba.src.noriskbo.code
{
    public class WorkflowBotoes
    {
        public enum enumBotaoWorkFlow
        {
            Salvar = 0,
            Editar = 1,
            Excluir = 2,
            Copiar = 3,
            Solicitar = 4,
            Aprovar = 5,
            Rejeitar = 6,
            Voltar = 7
        }

        /// <summary>
        /// Carrega os botões necessários na barra de menu
        /// </summary>
        public static void CarregarBarraBotoes(ControlMenuBar pBarraBotoes,
                                                ControlMenuBar.Botao.DelegateClick pEventoSalvar,
                                                ControlMenuBar.Botao.DelegateClick pEventoEditar,
                                                ControlMenuBar.Botao.DelegateClick pEventoExcluir,
                                                ControlMenuBar.Botao.DelegateClick pEventoCopiar,
                                                ControlMenuBar.Botao.DelegateClick pEventoSolicitar,
                                                ControlMenuBar.Botao.DelegateClick pEventoAprovar,
                                                ControlMenuBar.Botao.DelegateClick pEventoRejeitar,
                                                ControlMenuBar.Botao.DelegateClick pEventoVoltar)
        {
            pBarraBotoes.AddNewButton("Salvar", "Salvar", "save.png", (int)enumBotaoWorkFlow.Salvar, pEventoSalvar);
            pBarraBotoes.AddNewButton("Editar", "Editar", "page_edit.png", (int)enumBotaoWorkFlow.Editar, pEventoEditar);
            pBarraBotoes.AddNewButton("Excluir", "Excluir", "delete.png", (int)enumBotaoWorkFlow.Excluir, pEventoExcluir);
            pBarraBotoes.AddNewButton("Copiar", "Copiar", "pages_add.png", (int)enumBotaoWorkFlow.Copiar, pEventoCopiar);
            pBarraBotoes.AddNewButton("Solicitar", "Solicitar Aprovação", "page_next.png", (int)enumBotaoWorkFlow.Solicitar, pEventoSolicitar);
            pBarraBotoes.AddNewButton("Aprovar", "Aprovar", "page_accept.png", (int)enumBotaoWorkFlow.Aprovar, pEventoAprovar);
            pBarraBotoes.AddNewButton("Rejeitar", "Rejeitar", "page_delete.png", (int)enumBotaoWorkFlow.Rejeitar, pEventoRejeitar);
            pBarraBotoes.AddNewButton("Voltar", "Voltar", "previous.png", (int)enumBotaoWorkFlow.Voltar, pEventoVoltar);
        }

        /// <summary>
        /// Controla a visibilidade dos botões das paginas PageOperacao e PageGarantia
        /// </summary>
        /// <param name="pBarraBotoes">Barra de Botões carregada</param>
        /// <param name="pStatusDeControle">Status da Operação ou Garantia
        /// pStatus "-": Quando exibindo uma operacao ou garantia automática
        /// pStatus "+": Quando incluindo, alterando ou copiando uma operacao ou garantia
        /// </param>
        /// <param name="pUsuarioSolicitou">Último usuário que alterou o registro</param>
        public static void ControleVisibilidade(ControlMenuBar pBarraBotoes, string pStatusDeControle, string pUsuarioSolicitou, bool pPermitirCopiar)
        {
            IEnumerator<ControlMenuBar.Botao> botao = pBarraBotoes.Botoes.GetEnumerator();

            if (String.IsNullOrEmpty(pStatusDeControle))
                pStatusDeControle = "-";

            //Valida se perfil é no minimo digitador
            //se não está incluindo, alterando ou copiando
            // e se não está visualizando um registro de origem automática
            if (Perfil.Digitador() && (pStatusDeControle != "+") && (pStatusDeControle != "-"))
            {

                //botaoEnum.Reset();
                while (botao.MoveNext())
                {
                    switch (botao.Current.Sequencia)
                    {
                        case (int)enumBotaoWorkFlow.Voltar: //Sempre visível
                            botao.Current.Visivel = true;
                            break;

                        case (int)enumBotaoWorkFlow.Salvar:
                            botao.Current.Visivel = false;
                            break;

                        case (int)enumBotaoWorkFlow.Editar:
                            //Se status igual à Rascunho
                            //ou se status igual à Em Aprovação e usuário conectado for o mesmo que Solicitou
                            botao.Current.Visivel = (pStatusDeControle.Equals("RA"));
                            //|| (pStatusDeControle.Equals("EA") && Global.Usuario.Equals(pUsuarioSolicitou)));

                            break;

                        case (int)enumBotaoWorkFlow.Copiar:
                            //Se status igual à Aprovado 
                            //e se registro da operacao permite copia
                            botao.Current.Visivel = (pStatusDeControle.Equals("AP") && pPermitirCopiar);
                            break;

                        case (int)enumBotaoWorkFlow.Excluir:
                            //Se status igual à Rascunho
                            //ou se status igual à Aprovado e perfil do usuario igual à Aprovador                                
                            botao.Current.Visivel = (pStatusDeControle.Equals("RA")
                                                     || (pStatusDeControle.Equals("AP") && Perfil.Aprovador()));
                            break;

                        case (int)enumBotaoWorkFlow.Solicitar:
                            //Se status igual à Rascunho
                            botao.Current.Visivel = pStatusDeControle.Equals("RA");
                            break;

                        case (int)enumBotaoWorkFlow.Aprovar:
                            //Se perfil do usuario igual à Aprovador
                            //e se status igual à Em Aprovação ou Em Exclusão
                            //e se usuario for diferente do usuario que Solicitou
                            botao.Current.Visivel = (Perfil.Aprovador()
                                                     && (pStatusDeControle.Equals("EA") || pStatusDeControle.Equals("EE"))
                                                     && (Global.Usuario != pUsuarioSolicitou));
                            break;

                        case (int)enumBotaoWorkFlow.Rejeitar:
                            //Se perfil do usuario igual à Aprovador e se status igual à Em Aprovação ou Em Exclusão.
                            //Ou se perfil do usuario igual à Digitar e status igual à Em Aprovação e usuário conectado for o mesmo que Solicitou
                            botao.Current.Visivel = ((Perfil.Aprovador() && (pStatusDeControle.Equals("EA") || pStatusDeControle.Equals("EE")))
                                                     || (Perfil.Digitador() && (pStatusDeControle.Equals("EA") && Global.Usuario.Equals(pUsuarioSolicitou)))
                                                     );
                            break;
                    }

                }

            }
            else
            {
                //Se estou alterando ou incluindo

                //Desabilita todos os botões deixando habilitado apenas o botão voltar
                while (botao.MoveNext())
                {
                    //botaoEnum.Current.Visivel = (botaoEnum.Current.Sequencia.Equals((int)enumSequenciaBotoes.Voltar)); //(botaoEnum.Current.Nome == "Voltar");

                    switch (botao.Current.Sequencia)
                    {
                        case (int)enumBotaoWorkFlow.Voltar: //Sempre visível
                            botao.Current.Visivel = true;
                            break;

                        case (int)enumBotaoWorkFlow.Copiar: //Se origem automatica e tiver permissao de copiar 
                            botao.Current.Visivel = (Perfil.Digitador() && pStatusDeControle.Equals("-")
                                                     && pPermitirCopiar);
                            break;

                        case (int)enumBotaoWorkFlow.Salvar: //Se estiver incluindo ou alterando
                            botao.Current.Visivel = (Perfil.Digitador() && pStatusDeControle.Equals("+"));
                            break;

                        default:
                            botao.Current.Visivel = false;
                            break;
                    }

                }
            }

            pBarraBotoes.AtualizarControles();
        }

    }



}
